home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Software Contest 3 / FM Towns Software Contest 3.iso / exp / astral / a1 / game / source / space.c < prev    next >
C/C++ Source or Header  |  1994-01-07  |  3KB  |  113 lines

  1. // "space.c"
  2. // ワイヤーフレームによる空間の表現
  3. // ゲーム用カスタムバージョン
  4.  
  5. #define SORT_OFF
  6. // #define HIT_OFF
  7. // #define GAME_CUSTOM
  8.  
  9. #include <stdio.h>
  10. #include "wire3d.h"
  11. #include "sin8.c"
  12.  
  13. extern WIRE_SPACE Space[MAX_OBJECT];
  14. extern WIRE_OBJECT Object[];
  15. extern SCREEN_LOCATE Screen[MAX_OBJECT];
  16. extern int N_page,W_page;
  17.  
  18. int Sort[MAX_OBJECT];
  19.  
  20. void wirespace(ANGLE *langle,int *loffset,int obj_num,int page)
  21. {
  22.     int i;
  23.     int point_w[4][3],z_w;
  24.     ANGLE d_angle[MAX_OBJECT][3];
  25.     int temp2,temp3,obj_num2;
  26.     int pass[MAX_OBJECT];
  27.     
  28.     for(i=0;i<obj_num;i++){
  29.         if(Space[i].obj_no==-1){
  30.             pass[i]=1;
  31.             goto EXIT_roll;
  32.         }
  33.         
  34.         pass[i]=0;
  35.         
  36.         point_w[0][0]=Space[i].locate[0]-loffset[0];
  37.         point_w[0][1]=Space[i].locate[1]-loffset[1];
  38.         point_w[0][2]=Space[i].locate[2]-loffset[2];
  39.         
  40.         point_w[1][0]=( point_w[0][0]*cos_data[langle[1]] +
  41.           point_w[0][2]*sin_data[langle[1]])>>7;
  42.         point_w[1][2]=(-point_w[0][0]*sin_data[langle[1]] +
  43.           point_w[0][2]*cos_data[langle[1]])>>7;
  44.         
  45.         point_w[2][1]=( point_w[0][1]*cos_data[langle[0]]-
  46.          point_w[1][2]*sin_data[langle[0]])>>7;
  47.         Screen[i].locate[2] = ( point_w[0][1]*sin_data[langle[0]]+
  48.          point_w[1][2]*cos_data[langle[0]])>>7;
  49.         
  50.         Screen[i].locate[0] = ( point_w[1][0]*cos_data[langle[2]]-
  51.          point_w[2][1]*sin_data[langle[2]])>>7;
  52.         Screen[i].locate[1] = ( point_w[1][0]*sin_data[langle[2]]+
  53.          point_w[2][1]*cos_data[langle[2]])>>7;
  54.         
  55.         d_angle[i][0]=Space[i].angle[0]-langle[0];
  56.         d_angle[i][1]=Space[i].angle[1]-langle[1];
  57.         d_angle[i][2]=Space[i].angle[2]-langle[2];
  58.         
  59.         EXIT_roll:
  60.         Sort[i]=i;
  61.     }
  62.     
  63.     #ifndef SORT_OFF
  64.     
  65.     obj_num2=obj_num-1;
  66.     for(i=0;;){
  67.         if(Screen[Sort[i]].locate[2]<Screen[Sort[i+1]].locate[2] &&
  68.          pass[Sort[i]]==0){
  69.             temp2=Sort[i];
  70.             Sort[i]=Sort[i+1];
  71.             Sort[i+1]=temp2;
  72.             temp3=1;
  73.         }
  74.         i++;
  75.         if(i==obj_num2){
  76.             if(temp3==0)goto EXIT_sort;
  77.             i=0;
  78.             temp3=0;
  79.         }
  80.     }
  81.     EXIT_sort:
  82.     
  83.     #endif
  84.     
  85.     #ifdef GAME_CUSTOM
  86.     
  87.     wait_VSYNC();
  88.     chgpage(N_page);
  89.     clear_screen(W_page,6);
  90.     star(langle,W_page);
  91.     
  92.     #endif
  93.     
  94.     for(i=0;i<obj_num;i++){
  95.         if(Screen[Sort[i]].locate[2]>-(Object[Space[Sort[i]].obj_no].size)
  96.          && Screen[Sort[i]].locate[2]<65536 && pass[Sort[i]]==0)
  97.             wire3d(d_angle[Sort[i]],Screen[Sort[i]].locate,
  98.              &Object[Space[Sort[i]].obj_no],page);
  99.     }
  100.     
  101.     #ifndef HIT_OFF
  102.     
  103.     for(i=0;i<obj_num;i++){
  104.         if(pass[i]==1)continue;
  105.         z_w=Screen[i].locate[2]+0x100;
  106.         if(z_w<=0)continue;
  107.         Screen[i].locate[0]=(( Screen[i].locate[0]<<8)/z_w)+128;
  108.         Screen[i].locate[1]=((-Screen[i].locate[1]<<8)/z_w)+120;
  109.     }
  110.     
  111.     #endif
  112. }
  113.